一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<2^31)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k
的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
输出样例:
思路
用start来记录连乘的第一个因子,len来记录连续因子的长度,都初始化为0。如果start遍历之后仍未0,说明n在2-sqrt(n)范围之内没有因子,即n为素数,直接输出1和n就行了;否则输出[tart,start+len]
注意判断素数情况
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include <iostream> #include <cmath> using namespace std; int main() { long n; cin >> n; int start = 0, len = 0; for(int i = 2; i <= sqrt(n); i++) { long tmp = 1; for(int j = i; j*tmp <= n; j++) { tmp *= j; if(n%tmp==0 && j-i+1>len) { start = i; len = j-i+1; } } } if(start == 0) cout << "1\n" << n; else { cout << len << endl << start; for(int i = start+1; i < start+len; i++) { cout << "*" << i; } } }
|
另一种版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include <iostream> #include <vector>
using namespace std;
bool func(long n) { if(n == 1) { return false; } for(long i = 2; i * i <= n; i++) { if(n % i == 0) { return false; } } return true; }
int main() { long n; scanf("%ld", &n); if(func(n)) { printf("1\n"); printf("%d\n", n); return 0; } vector<int> ret; for(int i = 2; i * i <= n; i++) { if(n % i == 0) { vector<int> ve; ve.push_back(i); int t = n / i; int j = i + 1; while(t > 1 && t % j == 0) { ve.push_back(j); t = t / j; j++; } if(ve.size() > ret.size()) { ret = ve; } } } printf("%d\n", (int)ret.size()); for(int i = 0; i < (int)ret.size(); i++) { printf("%d", ret[i]); printf("%c", i == (int)ret.size() - 1 ? '\n' : '*'); } return 0; }
|